#include "cfilterdata.h"

CFilterData::CFilterData(QObject *parent)
    :QSortFilterProxyModel(parent)
{
    _filtrarContatadas = false;
    _filtrarMarcadas = false;
    _filtrarNovas = false;
}

void CFilterData::setModelo(CVagasModel *modelo)
{
    QObject::connect(modelo, SIGNAL(processandoChanged()), this, SLOT(houveAlteracaoNoModelo()));
    QObject::connect(modelo, SIGNAL(quantidadeVagasChanged()), this, SLOT(houveAlteracaoNoModelo()));
    this->setSourceModel(modelo);    
}

bool CFilterData::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{
    QModelIndex indice = sourceModel()->index(source_row, 0);
    QList<bool> resultados;
    QString estado(""), cidade(""), empresa(""), conector("");
    bool vagaContatada, vagaMarcada, vagaNova;

    estado = sourceModel()->data(indice, CVagasItem::estadoRole).toString();
    cidade = sourceModel()->data(indice, CVagasItem::cidadeRole).toString();
    empresa = sourceModel()->data(indice, CVagasItem::empresaRole).toString();
    vagaContatada = sourceModel()->data(indice, CVagasItem::infoContatoRole).isValid();
    vagaMarcada = sourceModel()->data(indice, CVagasItem::marcadoRole).toBool();
    vagaNova = sourceModel()->data(indice, CVagasItem::vagaNovaRole).toBool();

    for (int i = 0; i < _filtros.count(); i++) {
        QVariantList valoresFiltro = _filtros.at(i).value<QVariantList>();
        QString tipoF, sinalF, valorF, juncaoF, valorComparar;
        tipoF = valoresFiltro.at(0).toString();
        sinalF = valoresFiltro.at(1).toString();
        valorF = valoresFiltro.at(2).toString();
        juncaoF = valoresFiltro.at(3).toString();

        if (tipoF == "estado")
            valorComparar = estado;
        else if (tipoF == "cidade")
            valorComparar = cidade;
        else if (tipoF == "empresa")
            valorComparar = empresa;

        bool teste;
        teste = valorComparar == valorF;
        if (sinalF == "!=")
            teste = !teste;

        resultados.append(teste);

        if (conector != "") {
            bool bUltimo = resultados.last();
            resultados.pop_back();
            bool bAnte = resultados.last();
            resultados.pop_back();
            bool testeAntigo;
            if (conector == "e")
                testeAntigo = bUltimo && bAnte;
            else if (conector == "ou")
                testeAntigo = bUltimo || bAnte;
            resultados.append(testeAntigo);
            conector = "";
        }

        if (juncaoF != "") {
            conector = juncaoF;
        }
    }
    bool ret = true;
    if (resultados.count() > 0)
    {
        ret = resultados.at(0);
        for (int i = 1; i < resultados.count(); i++)
            ret = ret && resultados.at(i);        
    }
    if (_filtrarContatadas)
        ret = ret && vagaContatada;
    if (_filtrarMarcadas)
        ret = ret && vagaMarcada;
    if (_filtrarNovas)
        ret = ret && vagaNova;
    return ret;
}

void CFilterData::houveAlteracaoNoModelo()
{
    invalidateFilter();
}

void CFilterData::Filtrar(const QVariantList &filtros)
{
    _filtros = filtros;
    invalidateFilter();
    emit totalItensChanged();
    emit filtroAtivoChanged();
}

void CFilterData::RemoverFiltros()
{
    _filtros.clear();
    _filtrarContatadas = false;
    _filtrarMarcadas = false;
    _filtrarNovas = false;
    invalidateFilter();
}

void CFilterData::FiltrarVagasContatadas(bool filtrar)
{
    _filtrarContatadas = filtrar;
    invalidateFilter();
    emit totalItensChanged();
}

void CFilterData::FiltrarVagasMarcadas(bool filtrar)
{
    _filtrarMarcadas = filtrar;
    invalidateFilter();
    emit totalItensChanged();
}

void CFilterData::FiltrarVagasNovas(bool filtrar)
{
    _filtrarNovas = filtrar;
    invalidateFilter();
    emit totalItensChanged();
}
